{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import os\n",
    "os.environ['CUDA_VISIBLE_DEVICES'] = ''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import malaya\n",
    "from tqdm import tqdm\n",
    "from unidecode import unidecode\n",
    "from bs4 import BeautifulSoup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "\n",
    "def simple_cleaning(string):\n",
    "    return re.sub(r'[ ]+', ' ', unidecode(string).replace('\\n', ' ').replace('--', ' ').replace('/', ' ').replace('\\r', ' ')).strip()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from malaya.text.rouge import postprocess_summary, filter_rouge, _get_word_ngrams, _rouge_clean, cal_rouge\n",
    "from malaya.text.function import split_into_sentences\n",
    "\n",
    "maxlen = 800\n",
    "\n",
    "def filtering_rouge(summary, contents, start = 0.15, increment = 0.05, break_at = 800, n = 1):\n",
    "    filtered = contents[:]\n",
    "    i = 0\n",
    "    while len(filtered.split()) > break_at:\n",
    "        filtered = filter_rouge(summary, filtered, n = n, threshold = start + increment * i)\n",
    "        i += 1\n",
    "    return filtered\n",
    "\n",
    "def clean_keyword(string):\n",
    "    string = string.split(',')\n",
    "    string = [simple_cleaning(s) for s in string]\n",
    "    return ','.join(string), len(string)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('train.csv')\n",
    "df = df[df['type'] == 'KEYWORD']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dataset</th>\n",
       "      <th>file_id</th>\n",
       "      <th>text</th>\n",
       "      <th>summary</th>\n",
       "      <th>type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>www</td>\n",
       "      <td>13534577</td>\n",
       "      <td>Crosslanguage blog mining and trend visualisat...</td>\n",
       "      <td>blog mining,crosslanguage,miscellaneous,trend ...</td>\n",
       "      <td>KEYWORD</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>kdd</td>\n",
       "      <td>1370349</td>\n",
       "      <td>Mining a stream of transactions for customer p...</td>\n",
       "      <td>approximate queries,customer profiles,dynamic ...</td>\n",
       "      <td>KEYWORD</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>kdd</td>\n",
       "      <td>6365307</td>\n",
       "      <td>A generative probabilistic approach to visuali...</td>\n",
       "      <td>em algorithm,hidden markov model,information s...</td>\n",
       "      <td>KEYWORD</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>fao780</td>\n",
       "      <td>faobetf_fb29fe</td>\n",
       "      <td>&lt;title&gt;Better freshwater fish farming: The Pon...</td>\n",
       "      <td>FISH PONDS,FISH CULTURE,FRESHWATER FISHES,EXTE...</td>\n",
       "      <td>KEYWORD</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>kdd</td>\n",
       "      <td>4295479</td>\n",
       "      <td>Pattern lattice traversal by selective jumps N...</td>\n",
       "      <td>nonnumerical algorithms and problems</td>\n",
       "      <td>KEYWORD</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  dataset         file_id                                               text  \\\n",
       "0     www        13534577  Crosslanguage blog mining and trend visualisat...   \n",
       "1     kdd         1370349  Mining a stream of transactions for customer p...   \n",
       "3     kdd         6365307  A generative probabilistic approach to visuali...   \n",
       "7  fao780  faobetf_fb29fe  <title>Better freshwater fish farming: The Pon...   \n",
       "8     kdd         4295479  Pattern lattice traversal by selective jumps N...   \n",
       "\n",
       "                                             summary     type  \n",
       "0  blog mining,crosslanguage,miscellaneous,trend ...  KEYWORD  \n",
       "1  approximate queries,customer profiles,dynamic ...  KEYWORD  \n",
       "3  em algorithm,hidden markov model,information s...  KEYWORD  \n",
       "7  FISH PONDS,FISH CULTURE,FRESHWATER FISHES,EXTE...  KEYWORD  \n",
       "8               nonnumerical algorithms and problems  KEYWORD  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['xwikis-keywords.jsonl00.splitted.translated',\n",
       " 'xwikis-keywords.jsonl01.splitted.translated',\n",
       " 'xwikis-keywords.jsonl02.splitted.translated',\n",
       " 'xwikis-keywords.jsonl03.splitted.translated',\n",
       " 'xwikis-keywords.jsonl04.splitted.translated',\n",
       " 'xwikis-keywords.jsonl05.splitted.translated']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from glob import glob\n",
    "\n",
    "xwikis = sorted(glob('xwikis-keywords.jsonl*.splitted.translated'))\n",
    "xwikis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = open('train.json', 'w')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(len(df)):\n",
    "    src = simple_cleaning(df['text'].iloc[i])\n",
    "    tgt = simple_cleaning(df['summary'].iloc[i])\n",
    "    tgt, tgt_len = clean_keyword(tgt)\n",
    "\n",
    "    if len(src.split()) >= maxlen:\n",
    "        continue\n",
    "\n",
    "    d = {\"translation\": {\"src\": src, \"tgt\": tgt, 'prefix': f'{tgt_len} kata kunci: '}}\n",
    "    train.write(f'{json.dumps(d)}\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "for f in xwikis:\n",
    "    with open(f) as fopen:\n",
    "        for l in fopen:\n",
    "            data = json.loads(l)\n",
    "            ms = simple_cleaning(data['ms'])\n",
    "            en = simple_cleaning(data['en'])\n",
    "            tgt = data['keyword']\n",
    "            tgt, tgt_len = clean_keyword(tgt)\n",
    "            \n",
    "            d = {\"translation\": {\"src\": ms, \"tgt\": tgt, 'prefix': f'{tgt_len} kata kunci: '}}\n",
    "            train.write(f'{json.dumps(d)}\\n')\n",
    "            d = {\"translation\": {\"src\": en, \"tgt\": tgt, 'prefix': f'{tgt_len} kata kunci: '}}\n",
    "            train.write(f'{json.dumps(d)}\\n')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\"translation\": {\"src\": \"George Philip Farran was born on November 21, 1876. He attended Trinity College in Dublin in 1876 for law. Later he graduated in Natural Science winning the Gold Medal of the subject for his class. Later in his life, Farran connected with The Department of Agriculture and Technical Instruction in 1900. He enjoyed his time here and was even promoted to be the Chief Inspector of Fisheries. Farran was a widely published scientist and had his work published in many journals, a few of them include; The Royal Irish Academy, The linnean Society, Exploration of the Sea, and The Zoological Society. However, Most of his work was published in the Scientific Investigations of the Fisheries Branch of the Department of Agriculture and Technical Instruction.\", \"tgt\": \"Personal life and education,Studies,George Philip Farran\", \"prefix\": \"3 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Menurut tradisi, Mark dan Marcellian adalah saudara kembar dari keluarga yang terkenal. Mereka tinggal di Rom dan menjadi suar di Gereja awal. Ketika mereka enggan berkorban kepada dewa-dewa Rom, mereka ditangkap. Ibu bapa mereka, Tranquillinus dan Martia, mengunjungi mereka di penjara, mendesak mereka untuk meninggalkan mereka sebagai orang Kristian. Namun, Saint Sebastian meyakinkan mereka untuk tidak meninggalkan kepercayaan mereka. Sebastian menukar Tranquillinus dan Martia, serta Tiburtius, anak lelaki Chromatius, pengawas tempatan. Nicostratus, seorang pegawai lain, dan isterinya Zoe, juga ditukar. Nicostratus kemudian membawa tahanan yang lain; ini adalah enam belas orang yang juga ditukar oleh Sebastian. Mark dan Marcellian disembunyikan oleh Castulus, seorang pegawai Kristian, tetapi mereka dikhianati oleh seorang murtad, Torquatus. Mark dan Marcellian digantung di sana selama sehari penuh sehingga mereka dicucuk dengan tanglung. Kembar itu dikebumikan di Via Ardeatina, berhampiran perkuburan Domitilla. Nicostratus dan lima yang lain lemas di Tiber. Tiburtius dilemparkan ke dalam parit dan dikebumikan hidup-hidup. Mayat Marcus dan Marcellianus dipindahkan, mungkin pada abad kesembilan, ke Gereja Santi Cosma e Damiano. Mereka ditemui di sana pada tahun 1583 semasa pemerintahan Paus Gregory XIII. Pada tahun 1902, basilica mereka di katacombs Saint Balbina ditemui semula.\", \"tgt\": \"Mark and Marcellian,Veneration,Legend\", \"prefix\": \"3 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"According to tradition, Mark and Marcellian were twin brothers from a distinguished family. They lived in Rome and became deacons in the early Church. When they refused to sacrifice to the Roman gods, they were arrested. Their parents, Tranquillinus and Martia, visited them in prison, urging them to renounce their being Christians. However, Saint Sebastian convinced them not to abandon their faith. Sebastian converted Tranquillinus and Martia, as well as Tiburtius, the son of Chromatius, the local prefect. Nicostratus, another official, and his wife Zoe, were also converted. Nicostratus then brought the rest of the prisoners; these were sixteen people who were also converted by Sebastian. Mark and Marcellian were concealed by Castulus, a Christian officer, but they were betrayed by an apostate, Torquatus. Mark and Marcellian hung there for a full day until they were pierced with lances. The twins were buried in the Via Ardeatina, near the cemetery of Domitilla. Nicostratus and five others were drowned in the Tiber. Tiburtius was thrown into a ditch and buried alive. The bodies of Marcus and Marcellianus were moved, probably during the ninth century, to the Church of Santi Cosma e Damiano. They were discovered there in 1583 during the reign of Pope Gregory XIII. In 1902, their basilica in the catacombs of Saint Balbina was rediscovered.\", \"tgt\": \"Mark and Marcellian,Veneration,Legend\", \"prefix\": \"3 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Brownell lulus dari University of Liberia pada tahun 1994, menerima ijazah Sarjana Muda Sains dalam Pertanian Umum. Brownell menyatakan bahawa pemotongan hutan yang jelas untuk perkebunan minyak sawit membuat masyarakat tempatan bertambah buruk, kerana tidak cukup pekerjaan yang dibuat untuk mempekerjakan penduduk yang kehilangan tanah mereka akibat pembangunan. Sebagai sebahagian daripada karyanya yang melindungi tanah yang terancam dan menganjurkan masyarakat setempat, Brownell mengasaskan organisasi bukan kerajaan undang-undang alam sekitar pertama Liberia, Green Advocates International. Sebagai contoh, pada tahun 2010, pemerintah Liberia menyewa tanah di Sinoe County ke Golden Veroleum Liberia, sebuah syarikat pengeluar minyak sawit yang berpusat di Singapura. Syarikat itu merancang untuk mengubah tanah hutan menjadi ladang minyak sawit, tetapi penduduk tempatan mula memprotes pembersihan tanah mereka tanpa persetujuan mereka. Brownell dan pasukannya mendokumentasikan intimidasi dan gangguan anggota masyarakat, pemusnahan tanah dan rumah hutan, dan penodaan kubur dan tempat suci. Dia berusaha untuk mengajukan aduan dengan organisasi pensijilan global, Meja Bulat Minyak Sawit Lestari, yang meminta penghentian pembangunan tanah tersebut. Selepas itu, anggota keluarga Brownell ditangkap dan dia diserang, memaksanya melarikan diri dari negara itu. Setelah meninggalkan Liberia, dia menjadi \\\"Scholar Distinguished in Residence di Program Undang-Undang Sekolah Universiti Northeastern mengenai Hak Asasi Manusia dan Ekonomi Global\\\".\", \"tgt\": \"Education and career,Alfred Brownell\", \"prefix\": \"2 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Brownell graduated from the University of Liberia in 1994, receiving his Bachelor's of Science degree in General Agriculture. Brownell noted that the clear-cutting of forest for palm oil plantations left local communities worse off, because not enough jobs were created to employ residents who lost their land as a result of the development. As part of his work protecting threatened lands and advocating for local communities, Brownell founded Liberia's first environmental law non-governmental organization, Green Advocates International. For instance, in 2010, the Liberian government leased over of land in Sinoe County to Golden Veroleum Liberia, a Singapore-based palm oil producing company. The company planned to turn the forest land into palm oil plantations, but local residents began to protest the clearing of their land without their consent. Brownell and his team documented the intimidation and harassment of community members, the destruction of forest land and homes, and the desecration of graves and sacred sites. He worked to file complaints with a global certification organization, the Roundtable on Sustainable Palm Oil, which called for a halt on development of the land. Subsequently, Brownell's family members were arrested and he was attacked, forcing him to flee the country. After leaving Liberia, he became the \\\"Distinguished Scholar in Residence at Northeastern University School of Law Program on Human Rights and the Global Economy\\\".\", \"tgt\": \"Education and career,Alfred Brownell\", \"prefix\": \"2 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Pada tahun 1979, ECFA diasaskan oleh Billy Graham Evangelistic Association dan cabang US World Vision (World Vision International bukan anggota ECFA). ECFA ditubuhkan dengan penubuhan tujuh standard pertanggungjawaban yang merangkumi tadbir urus lembaga, syarat untuk penyata kewangan yang diaudit, keperluan untuk pendedahan orang ramai mengenai penyata kewangan yang diaudit, penghindaran konflik kepentingan, dan standard mengenai aktiviti penggalangan dana. Dipercayai bahawa standard pertanggungjawaban yang dicadangkan umumnya melebihi syarat undang-undang. Badan amal Evangelical dapat memohon akreditasi dan diminta untuk menyerahkan maklumat yang akan dikaji dan dinilai sesuai dengan standard tersebut. Mereka yang memenuhi standard tersebut akan diakreditasi dan diberi meterai persetujuan. Misi ECFA adalah untuk membantu organisasi amal agama untuk memperoleh dan menjaga rasa hormat dan keyakinan masyarakat terhadap operasi badan amal masing-masing melalui pematuhan dengan Standard, dan untuk melindungi orang ramai penderma dari kemungkinan tingkah laku yang tidak beretika dalam pengurusan urusan badan amal. Pernyataan misi yang diterima pakai oleh ECFA adalah seperti berikut: \\\"Meningkatkan Kepercayaan dalam Gereja dan Kementerian yang Dipusatkan Kristus\\\". Ulasan mengenai pernyataan misi boleh didapati di Laman Web ECFA. Anggota ECFA adalah badan amal yang dianjurkan di AS, biasanya 501 (c) 3 organisasi nirlaba dan gereja Evangelikal. Sebagai organisasi akreditasi, ECFA memberikan meterai persetujuan kepada anggota-anggota yang mematuhi Tujuh Piawaian Akauntabiliti. Walau bagaimanapun, senarai bekas anggota ECFA juga merangkumi penamatan kerana gagal memberikan maklumat atau mematuhi sepenuhnya piawaian. Dalam tinjauan tahun 2004, ECFA dilihat oleh responden sebagai program akreditasi yang berkesan yang memberikan jaminan hak kewangan bagi anggotanya. ECFA membentuk Suruhanjaya Kebertanggungjawaban dan Dasar untuk Organisasi Agama untuk membantu proses ini. Selain panel agama, ada juga panel undang-undang, dan panel bukan keuntungan. Pada April 2011, ECFA menamakan ahli-ahli kepada suruhanjaya tersebut. ECFA adalah penaja dan tuan rumah bagi suruhanjaya itu dan bertanggungjawab terhadap kos logistik Suruhanjaya. Sumbangan awam diminta untuk menyokong aktiviti Suruhanjaya.\", \"tgt\": \"History,Mission,Evangelical Council for Financial Accountability,Commission on Accountability and Policy for Religious Organizations,Membership,Integrity standards\", \"prefix\": \"6 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"In 1979, the ECFA was founded by the Billy Graham Evangelistic Association and the US branch of World Vision (World Vision International is not a member of ECFA). ECFA was founded with the establishment of seven standards of accountability that covered board governance, the requirement for audited financial statements, the requirement for public disclosure of the audited financial statements, the avoidance of conflicts of interest, and standards regarding fundraising activities. It was believed that the proposed standards of accountability generally exceeded the requirements of law. Evangelical charities could apply for accreditation and were required to submit information that would be reviewed and evaluated against those standards. Those meeting the standards would be accredited and granted a seal of approval. The mission of ECFA is to assist religious charitable organizations to gain and maintain the public respect and confidence in the operations of the respective charity through the compliance with the Standards, and to protect the donor public from possible unethical conduct in the management of the affairs of the charities. The mission statement adopted by ECFA is as follows: \\\"Enhancing Trust in Christ-Centered Churches and Ministries\\\". Commentary on the mission statement can be found on the ECFA Website. The ECFA members are organized charities in the US, typically 501(c)3 Evangelical nonprofits and churches. As an accrediting organization, ECFA provides a seal of approval to those members who adhere to Seven Standards of Accountability. However, ECFA's list of former members also includes terminations for failure to provide information or fully comply with the standards. In a 2004 survey, ECFA was seen by respondents as an effective accreditation program that provided assurance of financial propriety for its members. ECFA formed the Commission on Accountability and Policy for Religious Organizations to assist in this process. In addition to the religious panel, there was also a legal panel, and a non-profit panel. In April 2011, ECFA named members to the commission. ECFA was the sponsor and host for the commission and responsible for the logistical costs of the Commission. Public contributions were solicited in support of the Commission's activities.\", \"tgt\": \"History,Mission,Evangelical Council for Financial Accountability,Commission on Accountability and Policy for Religious Organizations,Membership,Integrity standards\", \"prefix\": \"6 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"De Soto bertugas di kapal hamba Brazil, \\\"Defensor de Pedro\\\". Setelah membunuh beberapa penumpang dan kru dengan tembakan meriam, de Soto membunuh kapten dan mengambil alih kapal itu. Namun, de Soto tidak dapat menemui \\\"Star Pagi\\\" yang melayang. dan dalam beberapa hari selepas itu, kapten dan dua dari tiga tangan berkongsi nasib rakan mereka! De Soto kemudian berlayar ke Corunna. Jenayah De Soto mengejarnya setelah \\\"Burla Negra\\\" melanda terumbu dan hancur dari Cadiz. De Soto digantung dengan kru yang tinggal.\", \"tgt\": \"Capture and death,Atrocities,Benito de Soto,Turn to piracy\", \"prefix\": \"4 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"De Soto served on a Brazilian slave ship, the \\\"Defensor de Pedro\\\". After killing some of the passengers and crew with cannon fire, de Soto murdered the captain and took possession of the ship. However, de Soto could not find the drifting \\\"Morning Star\\\". and in a few days after, the captain and two of the three hands shared the fate of their companions! De Soto then sailed for Corunna. De Soto's crimes caught up with him after the \\\"Burla Negra\\\" struck a reef and was wrecked off Cadiz. De Soto was hanged with his remaining crew.\", \"tgt\": \"Capture and death,Atrocities,Benito de Soto,Turn to piracy\", \"prefix\": \"4 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Bahan psychedelic adalah ubat psikoaktif yang tindakan utamanya adalah mengubah kognisi dan persepsi. Lysergamides adalah derivatif amida asid lysergic alkaloid. Dadah yang mengandungi moiety tryptamine biasanya merupakan substrat untuk reseptor serotonin, sesuai dengan persamaan strukturnya yang dekat dengan serotonin, neurotransmitter. Keluarga DOx psychedelics juga dikenali sebagai \\\"amfetamin yang diganti\\\" kerana ia mengandungi tulang belakang amfetamin tetapi diganti pada cincin benzena. Ini menimbulkan agonis serotonin yang serupa dengan kelas 2C-X tetapi lebih tahan terhadap penghapusan di dalam badan. Ini dilakukan melalui mengurangkan atau menyekat isyarat ke minda sedar dari bahagian otak yang lain. mula muncul di pasar kelabu baru-baru ini pada tahun 2013. Piperazine yang mengandungi ubat berjenama mempunyai kesan yang serupa dengan MDMA (ekstasi). Kelas ubat ini meniru serotonin yang mengaktifkan subtipe reseptor 5-HT yang melepaskan norepinefrin dan dopamin. Empathogens adalah kelas ubat psikoaktif yang menghasilkan kesan emosi dan sosial yang serupa dengan MDMA. Pengguna empathogens mengatakan bahawa ubat-ubatan tersebut sering menghasilkan perasaan empati, cinta, dan kedekatan emosi dengan orang lain. Metilenadioxyphenethylamines yang terganti (MDxx) adalah kelas kimia besar derivatif phenethylamines, yang merangkumi banyak ubat psikoaktif yang bertindak sebagai entactogen, psychedelics, dan atau perangsang, serta entheogen. Benzofurans serupa strukturnya dengan MD (M) A tetapi berbeza kerana kumpulan metilenadioksi telah diubah, mengeluarkan salah satu daripada dua oksigen dalam cincin metilenadioksi untuk menjadikan cincin benzofuran. Fenethylamine jenis indan dan tetralin samar-samar berkaitan dengan analog amphetamine mereka. Dadah yang mengandungi moiety tryptamine biasanya merupakan substrat untuk reseptor serotonin, sesuai dengan persamaan strukturnya yang dekat dengan serotonin, neurotransmitter. Amfetamin yang diganti adalah kelas kimia perangsang, entakogen, halusinogen, dan ubat lain. Amfetamin adalah kelas kimia perangsang, entakogen, halusinogen, dan ubat lain. Cathinone merangkumi beberapa perangsang dan entakogen, yang merupakan derivatif katalinone. Pyrrolidines adalah amfetamin dengan kumpulan pyrrolidine. Pyrrolidinophenones (juga disebut Pyrovalerones) adalah katalinones (bk-amphetamines) dengan kumpulan pyrrolidine. Thiophenes adalah ubat perangsang yang merupakan analog amfetamin atau cathinone di mana cincin fenil telah digantikan oleh thiophene. Piperidine dan derivatifnya terdapat di mana-mana blok bangunan dalam sintesis banyak farmaseutikal dan bahan kimia halus. Dalam derivatif oxazolidine, selalu ada karbon antara oksigen dan nitrogen. Penenang adalah bahan yang mendorong penenang dengan mengurangkan kerengsaan atau kegembiraan. Penenang boleh disalahgunakan untuk menghasilkan kesan yang terlalu membebankan. Sekiranya berlaku overdosis atau jika digabungkan dengan ubat penenang lain, banyak ubat ini boleh menyebabkan ketidaksadaran dan bahkan kematian. Ahli agonis reseptor cannabinoid pusat jenis 1 meniru kesan tingkah laku ganja. Indazole yang mengandungi agonis reseptor cannabinoid termasuk: Indole yang mengandungi agonis reseptor cannabinoid termasuk: Steroid anabolik Androgenic telah meluluskan penggunaan perubatan dan juga digunakan secara haram sebagai ubat peningkatan prestasi untuk membina jisim otot dan kekuatan. Steroid anabolik yang telah dirancang untuk mengelakkan pengesanan dalam ujian doping sukan dikenali sebagai \\\"steroid pereka\\\". Mereka bertujuan untuk mengekalkan kesan pembinaan otot yang diinginkan dari steroid anabolik sambil mengurangkan tindakan androgenik yang tidak diingini (mis. SARM yang lebih selektif dalam tindakannya berpotensi dapat digunakan untuk petunjuk klinikal yang lebih luas daripada penggunaan sah yang agak terhad yang sedang disetujui oleh steroid anabolik. Analog GHRH merangsang pembebasan hormon pertumbuhan.\", \"tgt\": \"Tropanes and Piperidines,Benzofurans,Diarylethylamines,Psychedelics,DOx,Pyrrolidines and Pyrrolidinophenones,Oxazolidines,Piperazines,Indole based,MDxx,Androgens,Tryptamines,GHRH analogues,2C-x,SARMs,Thiophenes,List of designer drugs,Stimulants,Dissociatives,Arylcyclohexylamines,Amphetamines,Empathogens,Opioids,Growth hormone secretagogue receptor agonists,Phenethylamines,Miscellaneous polycyclic phenethylamines,Phenylmorpholines,Synthetic cannabinoids,Cathinones,PDE5 inhibitors,Indazole based,Peptides,Lysergamides,Sedatives\", \"prefix\": \"34 kata kunci: \"}}\r\n"
     ]
    }
   ],
   "source": [
    "!tail -n 10 train.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['berita-sukan.json.nested',\n",
       " 'berita-hiburan.json.nested',\n",
       " 'berita-teknologi.json.nested',\n",
       " 'berita-dunia.json.nested',\n",
       " 'berita-bisnes.json.nested',\n",
       " 'berita-politik.json.nested',\n",
       " 'berita-malaysia.json.nested',\n",
       " 'berita-english.json']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "glob('berita-*')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "astro = sorted(glob('berita-*'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "berita-bisnes.json.nested\n",
      "berita-dunia.json.nested\n",
      "berita-english.json\n",
      "berita-hiburan.json.nested\n",
      "berita-malaysia.json.nested\n",
      "berita-politik.json.nested\n",
      "berita-sukan.json.nested\n",
      "berita-teknologi.json.nested\n"
     ]
    }
   ],
   "source": [
    "for f in astro:\n",
    "    print(f)\n",
    "    with open(f) as fopen:\n",
    "        data = json.load(fopen)\n",
    "    for d in data:\n",
    "        try:\n",
    "            soup = BeautifulSoup(d['r']['response']['articleBody'], \"lxml\")\n",
    "            text = simple_cleaning(BeautifulSoup(soup.text, 'lxml').text)\n",
    "            tgt = ','.join(d['original']['tags'])\n",
    "            tgt, tgt_len = clean_keyword(tgt)\n",
    "            d = {\"translation\": {\"src\": text, \"tgt\": tgt, 'prefix': f'{tgt_len} kata kunci: '}}\n",
    "            train.write(f'{json.dumps(d)}\\n')\n",
    "        except Exception as e:\n",
    "            pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\"translation\": {\"src\": \"Kata kunci iPhone 6 terus trending di Twitter dari hari ke hari. Peranti yang bakal diperkenalkan 12 tengah malam Selasa waktu Malaysia membuatkan orang ramai dari seluruh dunia tidak sabar untuk melihat dan memilikinya. Majlis pelancaran ini boleh disaksikan menerusi penstriman langsung di apple.com. Sebelum ini, kami telah melaporkan bahawa sudah ada beberapa individu yang telah mula beratur di apple store New York demi untuk memiliki iPhone terbaru keluaran apple itu. Namun di media sosial, ada juga peminat iPhone yang merancang tidak akan membeli iPhone 6 kerana saiznya yang agak besar berbanding keluaran iPhone sebelum ini. Walaupun iPhone 6 akan dilancarkan hari ini, ia hanya akan mula dijual di pasaran pada 19 September, sembilan hari selepas ia diperkenalkan. Selain iPhone 6, Apple juga bakal memperkenalkan sistem operasi baru, OS X Yosemite, IOS 8 dan juga iWatch.\", \"tgt\": \"kini trending,gadget,iphone\", \"prefix\": \"3 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Syarikat Apple pada Isnin mengumumkan perisian operasi baru yang akan memudahkan penggunaan di antara peranti mudah alih keluarannya itu dengan komputer Macintosh untuk suatu pengalaman berbeza. Sistem pengendalian yang diberi nama 'Yosemite' serta perisian IOS 8 untuk iPad, iPhone dan peranti iPod ini diumumkan dihadapan 6,000 pemaju di sebuah persidangan di San Francisco. Dalam ucapannya, Ketua Eksekutif Apple, Tim Cook berkata teknologi baru ini akan melancarkan penggunaan daripada satu peranti Apple kepada yang lain serta menggambarkannya sebagai 'satu pengalaman hebat yang tiada tandingan dalam industri'. Selain daripada sistem operasi kemas kini, syarikat yang berpangkalan di California itu turut melancarkan perisian Homekit untuk peralatan rumah dan Healthkit, iaitu satu perisian untuk menguruskan penjagaan kesihatan seperti mengesan aktiviti seharian penggunanya serta waktu tidur. Cook turut menumpukan ucapannya kepada pembangunan perisian yang dibentangkan dan menyifatkannya sebagai satu pelancaran perisian terbesar yang pernah diumumkan oleh App Store Apple turut memperkenalkan pengaturcaraan bahasa yang dikenali sebagai 'Swift' dimana ia membolehkan pemaju membuat program yang lebih pantas, moden, selamat dan lebih interaktif berbanding menggunakan pengaturcaraan Objective C. Berita penuh di sini.\", \"tgt\": \"Apple,Macintosh,Yosemite,iPad,iPhone\", \"prefix\": \"5 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Desas-desus rekabentuk iPhone 6 yang dijangka akan dikeluarkan di pasaran September ini, menjadi topik bualan hangat dikalangan penggemar produk Apple. Pelbagai teori dibuat dan pelbagai jenis gambar dimuatnaik di laman media sosial menunjukkan kemungkinan rekabentuk telefon pintar itu. Namun, bagaimanakah rekabentuk telefon pintar itu, masih belum diketahui. \\t\\t\\tI'm getting the iPhone 6. I need something new. \\t\\t Casper (@ObeyProdigy) March 13, 2014 \\t\\t\\tIf this is really the iPhone 6... We're gonna have to start collecting a new set of cases... Again pic.twitter.com 81NITeRYsO \\t\\t Trevon (@TheWhiteNinja99) March 20, 2014 \\t\\t\\tNew iPhone 6 Rumors and Speculations Released! I can't wait to see if #1 is Real!! http: t.co qil3bA2ecp pic.twitter.com kcntZLwTSl \\t\\t Rich Life (@MilIionaireLife) March 28, 2014 \\t\\t\\tiphone 6 rumors and designs....I'm excited! http: t.co uQQyXSruen \\t\\t idil (@idillionaire) March 13, 2014 Apa yang pasti, penggemar telefon pintar Iphone tidak sabar menunggu keluaran produk terkini Apple itu yang dikatakan bakal membawa ciri-ciri baru yang sesuai dengan citarasa pengguna. Menurut laporan portal berita Nikkei Business Daily, iPhone 6 datang dalam dua versi iaitu skrin berukuran 4.7 inci atau 5.5 inci dengan resolusi tinggi dan skrin yang lebih besar daripada produk sebelumnya. Laporan tersebut yang tidak menyebut mana-mana sumber berkata, Apple telah membuat tempahan paparan skrin cecair kristal beresolusi tinggi menerusi syarikat elektronik gergasi Jepun, Sharp, Japan Display dan syarikat ternama Korea, LG Display. Sementara itu, menurut laporan agensi berita Reuters, pengeluaran iPhone 6 dengan skrin berukuran 4.7 inci itu akan dikeluarkan lebih awal berbanding iPhone 6 dengan skrin berukuran 5.5 inci. Menurut laporan sebelum ini, Apple dikatakan merancang untuk menggunakan kristal nilam atau sapphire pada paparan skrin telefon iPhone berkenaan yang akan membuat ia hampir mustahil untuk pecah. Laman web 9to5Mac adalah yang pertama untuk melaporkan berita ini, yang mengatakan Apple dan GT Advanced bersetuju untuk menghasilkan sehingga 200 juta skrin gajet berkenaan. Berbanding dengan kaca biasa, kristal nilam susah untuk pecah atau calar. Ini menjadikan bahan yang sesuai untuk digunakan oleh Apple untuk keluaran iPhone seterusnya yang berkemungkinan akan mempunyai skrin yang sedikit melengkung seperti khabar angin yang tersebar di internet.\", \"tgt\": \"iPhone 6,Apple,rekabentuk\", \"prefix\": \"3 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Apple bakal membuat hebahan terbaru iPad dalam satu majlis tertutup pada penghujung bulan ini, demikian menurut laporan laman web berita teknologi, AllThingsD. iPad generasi baru tersebut dijangka akan lebih nipis daripada edisi sebelum ini dan kemampuan camera yang lebih hebat. Versi baru iPad mini juga turut akan mempunyai skrin yang ditambah baik. Tambah laporan AllThingsD, majlis tertutup itu akan diadakan pada 22 Oktober. Apple bagaimanapun enggan mengulas lanjut mengenai informasi daripada sumber tidak bernama itu. iPad kekal sebagai tablet paling laris, menurut kajian, namun pemasarannya dicabar dengan pesaing yang menggunakan sistem operasi Google Android. Apple dijangka akan membincangkan sistem operasi komputer dan komputer riba miliknya di majlis tersebut, yang dilakukan seiring dengan musim membeli belah hujung tahun. Apple kini gah di pasaran hasil pelancaran dua model iPhone pada bulan lalu. Menurut firma California itu, mereka telah berjaya merekodkan jualan sembilan juta unit iPhone dalam masa tiga hari setelah melancarkan versi iPhone baru terbabit.\", \"tgt\": \"Apple,AllThingsD,iPad,Google Android,iPhone,California\", \"prefix\": \"6 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"KUALA LUMPUR:Minggu ini, Gadget Nation menampilkan Ingress oleh Project Niantic (Google) dan \\\"Inovasi dan Teknologi\\\" bersama T.A. McCann. Juga, rebiu Gamers Station dan fakta-fakta pilihan minggu ini. Saksikan Gadget Nation pada hari Jumaat (10 Mei) jam 8.30 malam hanya di saluran Astro AWANI.\", \"tgt\": \"Gadget Nation,T A McCann\", \"prefix\": \"2 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Model terbaru telefon pintar Blackberry Z10 yang dinanti-nantikan bakal berada di pasaran bermula bulan hadapan. Z10 boleh didapati di pengedar sah Maxis bermula 9 Mac 2013 dengan program pra pendaftaran bermula esok (Khamis). Pelanggan Digi dan Celcom pula boleh mula membeli telefon skrin sentuh ini bermula 8 April. Telefon pintar ini dikuasakan oleh platform BlackBerry 10 dengan kira-kira 17,000 aplikasi, termasuk lebih 100 aplikasi boleh diakses oleh pengguna tempatan. Blackberry Z10 direka dengan pemproses (dual core), 1.5 Ghz dengan RAM 2GB, simpanan memori dalaman sebanyak 16GB serta slot kad memori yang fleksibel dimana ia mampu menerima jumlah memori sehingga 64GB.\", \"tgt\": \"Blackberry Z10,April\", \"prefix\": \"2 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Gosip mengenai Apple bakal mengeluarkan jam tangan pintar bukanlah satu perkara baru. Cerita mengenainya kembali hangat diperkata selepas New York Times mengeluarkan laporan mengenai jam tangan pintar yang diberi jolokan iWatch itu. New York Times melaporkan Apple kini sedang menguji iWatch secara dalaman dengan reka bentuk kaca melengkung padanya. Ianya berkemungkinan menggunakan sistem operasi iOS dan dikatakan bakal dipasarkan dalam tahun ini. Pengguna Apple sebelum ini menggabungkan iPod Nano dan Watchbands untuk berfungsi sebagai jam tangan. Namun perubahan saiz iPod Nano pada lima tahun lepas dianggap kurang sesuai untuk digayakan sebagai jam tangan. Jam tangan pintar belum lagi menjadi produk yang mampu menyaingi pasaran tablet dan telefon pintar. Namun pengguna menunjukkan minat mendalam untuk memilikinya. Beberapa syarikat startup juga berminat menghasilkan jam tangan pintar dan trend ini dibuktikan apabila beberapa pemain industri menunjukkan kesediaan mereka untuk peranti baru ini.\", \"tgt\": \"Apple,iWatch,jam tangan pintar,iPod nano,Steve Jobs,New York Times\", \"prefix\": \"6 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Google dan Samsung Electronics akan menjual komputer riba mereka, Chromebook, dengan harga hanya USD 249 (RM760.40). Produk yang diumumkan hari ini bertujuan memberi saingan kepada jualan daripada produk terbaru Microsoft dan Apple. Walaubagaimanapun, komputer riba yang berharga rendah ini tidak mempunyai cakera keras untuk simpanan dan beroperasi di atas sistem operasi Google Inc. Chrome Web yang agak baru. Ini bermakna sambungan Internet adalah penting. Pelbagai produk yang berharga lebih tinggi yang beroperasi menggunakan Windows 8 Microsoft Corp akan mula dijual minggu hadapan. Apple Inc pula dijangka memperkenalkan versi iPad yang lebih kecil secara meluas pada Selasa ini.\", \"tgt\": \"Samsung,Chromebook,laptop,Google,iPad\", \"prefix\": \"5 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Suasana keterujaan terserlah di Centre Court, Mid Valley Megamall pada hari Jumaat, dengan kumpulan orang ramai berkumpul untuk menjadi antara yang pertama memiliki model terbaru Samsung, GALAXY Note II. Studio untuk Samsung GALAXY Note II menyaksikan barisan mereka yang berbaris dari seawal pukul 7 pagi untuk mendapatkan sendiri telefon pintar yang direka untuk meningkatkan kreativiti seharian. Samsung Malaysia Electronics memberikan kepada 50 pengguna pertama pengecas desktop Galaxy Note II dan 50 lagi dengan \\\"flip covers\\\" asli. Edison Liew, pelanggan pertama yang berjaya mendapatkan telefon pintar itu, begitu gembira tatkala memegang jenama baharu GALAXY Note II milik beliau itu. \\\"Saya amat teruja dengan skrinnya yang besar dan pelbagai fungsi yang saya hanya baca daripada Internet,\\\" tambah beliau. GALAXY Note II pertama sekali diperkenalkan di Berlin sebulan yang lalu. Para pengguna boleh membeli telefon pintar berkenaan menerusi rakan pengendali Samsung, Celcom, Digi dan Maxis, atau mana-mana kedai jenama mudah alih Samsung seluruh negara. Samsung Electronics Co Ltd, peneraju global dalam semikonduktor, telekomunikasi, media digital dan teknologi digital, mencatatkan jualan US$143.1 bilion tahun lepas\", \"tgt\": \"Gajet,Jenayah,Notebook,Iphone,Pengguna\", \"prefix\": \"5 kata kunci: \"}}\r\n",
      "{\"translation\": {\"src\": \"Apple Inc telah mengesahkan sebuah majlis akan diadakan Selasa. Ramai yang bertanya, adakah ini majlis pengumuman produk baru iPad mini yang telah lama ditunggu-tunggu? iPad Mini yang dijangka di perkenalkan di California Theatre, San Jose ini ini dijangka dapat mencabar pesaing-pesaing Apple Inc seperti Amazon.com Inc dan Google Inc dengan produk iPad versi yang lebih kecil dan harga yang berpatutan. Dalam jemputannya kepada pihak media, Apple Inc hanya, menyatakan 'Kami ada sesuatu untuk anda.' Menurut khabar angin, iPad mini dijangka menampilkan skrin paparan berukuran 7.85 inci atau 7 inci. Selain itu , iPad mini juga dikhabarkan berharga lebih rendah daripada iPad sebelumnya. Menurut Sumber iPad mini ini akan dijual pada harga sekitar $250-$300 (RM763 - RM915).\", \"tgt\": \"Apple Inc,iPad mini,California Theatre,Amazon.com Inc,Google Inc\", \"prefix\": \"5 kata kunci: \"}}\r\n"
     ]
    }
   ],
   "source": [
    "!tail -n 10 train.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "train.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1128280 train.json\r\n"
     ]
    }
   ],
   "source": [
    "!wc -l train.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('test.csv')\n",
    "df = df[df['type'] == 'KEYWORD']\n",
    "\n",
    "test = open('test.json', 'w')\n",
    "for i in range(len(df)):\n",
    "    src = simple_cleaning(df['text'].iloc[i])\n",
    "    tgt = simple_cleaning(df['summary'].iloc[i])\n",
    "    tgt, tgt_len = clean_keyword(tgt)\n",
    "\n",
    "    if len(src.split()) >= maxlen:\n",
    "        continue\n",
    "\n",
    "    d = {\"translation\": {\"src\": src, \"tgt\": tgt, 'prefix': f'{tgt_len} kata kunci: '}}\n",
    "    test.write(f'{json.dumps(d)}\\n')\n",
    "    \n",
    "test.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "948 test.json\r\n"
     ]
    }
   ],
   "source": [
    "!wc -l test.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "!shuf train.json > shuffled-train.json\n",
    "!shuf test.json > shuffled-test.json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
